"""
数据处理计算
==============================================================================================
reduceByKey算子

针对 KV型 RDD，自动按照 key 分组，然后根据你提供的聚合逻辑，完成组内(value)的聚合操作

==============================================================================================
用法

rdd.reduceByKey(func)
# func: (V, V) -> V
# 接收两个入参、类型一致，返回一个返回值，类型和传入参数一致

"""

# 演示RDD的flatMap成员方法的使用
from pyspark import SparkConf, SparkContext
# windows 中 spark 找不到对于的 python 解释器会报错
import os

os.environ["PYSPARK_PYTHON"] = "D:/python3.11/python.exe"

conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)


# 准备一个RDD
rdd = sc.textFile("word.txt").flatMap(lambda x: x.split(" "))
print(rdd.collect())
all_word_list = rdd.collect()
data = []
for word in all_word_list:
    data.append((word, 1))

print(data)
rdd = sc.parallelize(data).reduceByKey(lambda x, y: x + y)
print(rdd.collect())


# 以上操作等同于
rdd = (
    sc.textFile("word.txt")
    .flatMap(lambda x: x.split(" "))
    # 将元素 x 转换为 元素 (x, 1)
    .map(lambda x: (x, 1))
    .reduceByKey(lambda x, y: x + y)
)
print(rdd.collect())
